package com.zmn.mcc.services.interfaces.dept;

import com.zmn.common.dto.StatusDTO;
import com.zmn.common.dto.VtDTO;
import com.zmn.mcc.model.entity.dept.DeptIdAndRoleId;
import com.zmn.mcc.model.entity.dept.McDept;
import com.zmn.mcc.model.entity.dept.McDeptQuery;

import javax.validation.constraints.NotNull;
import java.util.List;

/**
 * @author heguanghua
 * @since 2020/04/14 13:30
 */
public interface DeptService {

    McDept findByKey(Integer deptId);

    List<McDept> listPageByQuery(McDeptQuery query);

    List<McDept> listByOrgId(Integer orgId);

    List<McDept> listByOrgId(Integer orgId, Integer status);

    List<McDept> listByOrgIds(List<Integer> orgIds, Integer status);

    List<McDept> listByRoleId(Integer roleId);

    List<McDept> listByRoleId(Integer roleId, Integer status);

    List<McDept> listByDpermitDeptId(Integer deptId);

    List<McDept> listByDpermitDeptId(Integer deptId, Integer status);

    List<McDept> listByParentId(Integer parentId);

    List<McDept> listByParentId(Integer parentId, Integer status);

    List<McDept> listByParentId(Integer orgId, Integer parentId, Integer status);

    List<McDept> listByParentIds(List<Integer> deptIds, Integer status);

    List<McDept> listByQuery(McDeptQuery query);

    List<McDept> listDeptByOrgIdAndParentIds(Integer orgId, List<Integer> parentIdList, Integer level, Integer status);

    /**
     * 根据组织id列表、部门ID列表，查询部门ID列表下的所有子部门
     *
     * @param orgIds  组织id列表
     * @param deptIds 部门ID列表
     * @return 所有子部门id、名称、状态
     * @author xujie
     * @since 2021-05-17
     */
    List<VtDTO> listSubDeptVtByOrgIdsAndDeptIds(List<Integer> orgIds, @NotNull(message = "部门ID列表不能为空") List<Integer> deptIds);

    /**
     * 描述: 查询有效的部门
     *
     * @return java.util.List<com.zmn.mcc.model.entity.dept.McDept>
     * @author guoqiao
     * @since 2021/3/2 10:44
     */
    List<McDept> listValidDept();


    /**
     * 描述: 查询啄木鸟有效的部门
     *
     * @return java.util.List<com.zmn.mcc.model.entity.dept.McDept>
     * @author guoqiao
     * @since 2021/3/2 10:44
     */
    List<McDept> listValidZmnDept();


    /**
     * 描述: 根据部门id集合查询角色Id
     *
     * @param deptIdList 部门id集合
     * @return List<DeptIdAndRoleId>
     * @author xujie
     * @since 2021/05/28
     **/
    List<DeptIdAndRoleId> listDeptIdAndRoleIdByDeptIdList(List<Integer> deptIdList);

    Integer countByQuery(McDeptQuery query);


    Integer updateByKey(McDept dept);

    Integer updateRoleId(Integer deptId, Integer roleId, String updater);

    Integer updateRoleId(McDept dept);

    Integer updateStatus(Integer deptId, Integer status, String updater);

    Integer updateStatus(McDept dept);

    Integer updateStatusBatch(List<Integer> deptIds, Integer status, String updater);

    Integer updateStatusBatch(StatusDTO dto);

    Integer updateSort(Integer deptId, Integer sort);

    Integer updateSort(McDept dept);


    Integer insert(McDept dept);


    Integer deleteByKey(Integer deptId);

    /**
     * 根据北森部门ID查询部门信息
     *
     * @param bsDeptIds 北森部门ID
     * @return
     */
    List<McDept> listByBsDeptId(List<Integer> bsDeptIds);

    /**
     * 根据北森部门ID查询部门信息
     *
     * @param bsDeptId 北森部门ID
     * @return
     */
    McDept findByBsDeptId(Integer bsDeptId);

    /**
     * 统计北森部门ID的数量，不包括自己
     *
     * @param deptId   部门ID，统计时需要排除
     * @param bsDeptId 北森部门ID
     * @return
     */
    int countByBsDeptIdAndNotDeptId(Integer deptId, Integer bsDeptId);

    /**
     * 修改北森部门iD
     *
     * @param deptId   部门ID
     * @param bsDeptId 北森部门ID
     * @param updater  操作员
     */
    void updateBsDeptIdByDeptId(Integer deptId, Integer bsDeptId, String updater);
}
